﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using Colonisator.Classes;

namespace Colonisator.Classes
{
    /// <summary>
    /// Définit les composants de l'éditeur de plateau
    /// </summary>
    [Serializable()]
    public class EditeurPlateau                       
    {
        //[XmlElement("StylePlateau")]
        public string StylePlateau { get; set; }
        
        //[XmlElement("SurLongueurfaceMax")]
        public Int32 Longueur { get; set; }

        //[XmlElement("Largeur")]
        public Int32 Largeur { get; set; }

        //[XmlArray("IlesColonisables")]
        public List<IleColonisable> IlesColonisables { get; set; }

        //[XmlArray("IlesNeutres")]
        public List<IleNeutre> IlesNeutres { get; set; }

        //[XmlElement("Sundercity")]
        public Sundercity ContinentSundercity { get; set; }

        //[XmlElement("Missytown")]
        public Missytown ContinentMissytown { get; set; }

        //[XmlElement("Piofo")]
        public Piofo IlePiofo { get; set; }

        //[XmlElement("ElementsMax")]
        public ElementsPlateauMax ElementsMax { get; set; }

        /// <summary>
        /// Constructeur par défaut. Correspond à la partie STYLE_PLATEAU_DEFAUT
        /// </summary>
        public EditeurPlateau()
        {
            Longueur = 50;
            Largeur = 50;
            ElementsMax = new ElementsPlateauMax();
            StylePlateau = Constantes.STYLE_PLATEAU_DEFAUT;
        }

        /// <summary>
        /// Valide les éléments de plateau selon les normes données par le style de plateau.
        /// </summary>
        /// <param name="uneListeElementsManquants"></param>
        /// <returns></returns>
        public bool ValidationFinalePlateau(out GestionnaireMessages uneListeMessages)
        {
            uneListeMessages = new GestionnaireMessages();

            if (StylePlateau == Constantes.STYLE_PLATEAU_DEFAUT)
            {
                // Check des îles colonisables
                if (IlesColonisables.Count < ElementsMax.IlesColonisablesMax)
                    uneListeMessages.AjouterMessage("Vous n'avez pas le nombre recquis d'îles colonisables : " + ElementsMax.IlesColonisablesMax);

                // Check des îles neutres
                if (IlesNeutres.Count < ElementsMax.IlesNeutresMax)
                    uneListeMessages.AjouterMessage("Vous n'avez pas le nombre recquis d'îles neutres : " + ElementsMax.IlesNeutresMax);

                // Check de Sundercity
                if (ContinentSundercity == null)
                    uneListeMessages.AjouterMessage("Sundercity n'a pas été créée !");

                // Check de Missytown
                if (ContinentMissytown == null)
                    uneListeMessages.AjouterMessage("Missytown n'a pas été créée !");

                // Check de Piofo
                if (IlePiofo == null)
                    uneListeMessages.AjouterMessage("L'île de Piofo n'a pas été créée !");
            }

            return (uneListeMessages.Count() == 0);
        }

        /// <summary>
        /// Valide les éléments de mise en place initiale, avant la création effective du plateau
        /// N'est appellé que dans le cadre du QuickStart
        /// </summary>
        /// <param name="uneListeProblemes"></param>
        /// <returns></returns>
        public bool ValidationQuickStart(out GestionnaireMessages uneListeMessages)
        {
            uneListeMessages = new GestionnaireMessages();

            if (StylePlateau == Constantes.STYLE_PLATEAU_DEFAUT)
            {
                // Check de la surface totale
                if (Longueur * Largeur > ElementsMax.SurfaceMax)
                    uneListeMessages.AjouterMessage("La surface totale voulue [" + (Longueur * Largeur).ToString() + "], est supérieure à la limite max [" +
                        ElementsMax.SurfaceMax + "]");

                // Check de la longueur
                if (Longueur > ElementsMax.LongueurMax)
                    uneListeMessages.AjouterMessage("La longueur totale voulue [" + Longueur.ToString() + "], est supérieure à la limite max [" +
                        ElementsMax.LongueurMax + "]");

                // Check de la largeur
                if (Largeur > ElementsMax.LargeurMax)
                    uneListeMessages.AjouterMessage("La largeur totale voulue [" + Largeur.ToString() + "], est supérieure à la limite max [" +
                        ElementsMax.LargeurMax + "]");

                if (uneListeMessages.Count() > 0)
                    uneListeMessages.AjouterMessage("Veuillez modifier les valeurs associées");
            }

            return (uneListeMessages.Count() == 0);
        }
    }
}
